package model.fantasma;

import model.fabricas.FabricaEstados;
import model.interfaces.ICaminos;
import model.interfaces.IEstado;
import model.interfaces.IFantasma;
import model.interfaces.IPacman;
import model.utilidades.Vector;

public abstract class Fantasma implements IFantasma{
	protected Vector posicion;
	protected IEstado estado;
	protected ICaminos laberinto;
	private int direction; // 0=U,1=D,2=L,3=R,4=STILL

	public Fantasma(Vector posicionInicial,ICaminos nivel){
		posicion = posicionInicial;
		estado = FabricaEstados.crearEstadoCazador(this);
		laberinto = nivel;
		direction = 0;
	}
	
	public Vector getPosition(){
		return posicion;
	}
	
	public void convertirEnPresa(){
		estado.transicionAPresa();	
	}
	
	public void vivir(IPacman pacman){
		estado.actualizarEstado();
		mover(pacman);
	}
	
	public void cambiarEstado(IEstado nuevoEstado) {
		estado = nuevoEstado;
	}

	public abstract void mover(IPacman pacman); 	
	
	public void mover(Vector vel){
		posicion = posicion.sumarleElVector(vel);
	}
	
	@Override
	public void interactuarCon(IPacman pacman) {
		if(chocaCon(pacman))
		  estado.interactuarCon(pacman);
	}

	public Vector obtenerVelocidad(){
		return null;
	}
	
	public int getDirection(){
		return direction;
	}
	
	protected boolean chocaCon(IPacman pacman) {
		Vector posicionPacman = pacman.obtenerPosicion();
		Vector posicionFinalFantasma = posicion.sumarleElVector(obtenerVelocidad());
		
		if(!posicion.alineadoCon(posicionPacman)){
			return false;
		}
				
		boolean mismaPosicionInicial = posicion.esIgualA(posicionPacman);
		boolean mismaPosicionFinal = posicionFinalFantasma.esIgualA(posicionPacman);
		boolean loAtraviesa = !posicion.esMayorA(posicionPacman) && posicionFinalFantasma.esMayorA(posicionPacman); 
		boolean loAtraviesaEnsentidoContrario = posicion.esMayorA(posicionPacman) && !posicionFinalFantasma.esMayorA(posicionPacman);
	
		return (mismaPosicionInicial || mismaPosicionFinal || loAtraviesa || loAtraviesaEnsentidoContrario);
	}
	
}
